"""
某工厂生产两种产品 A 和 B，生产过程中需要消耗两种资源：原材料 和 机器工时。已知：
生产1单位A需要2kg原材料1小时机器工时利润30元,
生产1单位B需要1kg原材料2小时机器工时利润40元

工厂每天可用的资源总量为：
原材料 ≤ 100 kg,机器工时 ≤ 120 小时
目标： 如何安排 A 和 B 的产量，才能使 总利润最大？
"""
import unittest
from z3 import *


class TestLP(unittest.TestCase):
    def test_solve(self):
        # 定义变量
        x1 = Real('x1')  # 产品A的产量
        x2 = Real('x2')  # 产品B的产量

        # 创建求解器
        opt = Optimize()

        # 添加约束
        opt.add(2 * x1 + x2 <= 100)  # 原材料约束
        opt.add(x1 + 2 * x2 <= 120)  # 机器工时约束
        opt.add(x1 >= 0, x2 >= 0)  # 非负约束
        # 定义目标函数（Z3需要手动优化）
        max_z = 30 * x1 + 40 * x2
        opt.maximize(max_z)

        # 求解
        if opt.check() == sat:
            model = opt.model()
            print(f"最优解：A = {model[x1]}, B = {model[x2]}")
            print(f"最大利润 Z = {model.eval(max_z)}")
        else:
            print("无可行解")
